package com.tiancheng.trade.order.mapper;

import com.tiancheng.trade.order.bo.BatchOrderIdBO;
import com.tiancheng.trade.order.bo.OrderQueryBO;
import com.tiancheng.trade.order.model.Order;
import com.tiancheng.trade.order.model.join.OrderJoin;
import com.tiancheng.trade.order.vo.app.OrderCenterQueryVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 主订单持久化接口
 *
 * @author kellen
 * @date 2024-03-02
 */
@Repository
public interface OrderMapper extends TYBaseMapper<Order> {

    /**
     * 主订单退款次数
     * @param orderId
     * @param refundTimes
     * @return
     */
    @Update("update orders set refund_times = refund_times + #{refundTimes} where order_id = #{orderId}")
    int refund(@Param("orderId") String orderId, @Param("refundTimes") int refundTimes);

    /**
     * 查询统计订单的金额和数量
     * @param orderStatus
     * @param startTime
     * @param endTime
     * @return
     */
    Map<String, Long> queryTotal(@Param("orderStatus") List<String> orderStatus,
                                 @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 按照业务渠道统计订单的金额和数量
     * @param orderSource
     * @param orderStatus
     * @param startTime
     * @param endTime
     * @return
     */
    List<Map<String, Object>> queryTotalForSource(@Param("orderSource") String orderSource, @Param("orderStatus") List<String> orderStatus,
                                          @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 根据流水号查询主订单及子订单信息
     * @param flowId
     * @return
     */
    List<OrderJoin> findWithSubByFlowId(@Param("flowId") String flowId);

    long getCenterOrderCount(OrderCenterQueryVO queryVO);

    List<Order> getCenterOrder(OrderCenterQueryVO queryVO);

    /**
     * 根据订单号查询主订单及子订单信息
     * @param orderId
     * @return
     */
    List<OrderJoin> findWithSubByOrderId(@Param("orderId")String orderId);

    /**
     * 修改订单的下单渠道
     * @param orderIds 主订单集合
     * @param orderChannel 下单渠道
     * @return
     */
    int updateOrderChannel(@Param("orderIds") List<String> orderIds, @Param("orderChannel") String orderChannel);

    long findByUidCount(OrderQueryBO orderQueryBO);
    List<Order> findByUid(OrderQueryBO orderQueryBO);

    List<BatchOrderIdBO> findByUidAndBatchId(@Param("uid") String uid, @Param("batchIds") List<String> batchIds);
}